package ar.com.psicosoft.model.psicosoft_admin;

import java.io.Serializable;

import javax.persistence.*;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * The persistent class for the empresa database table.
 * 
 */
@Entity
@Table(name = "empresa", schema = "psicosoft_admin")
@NamedQueries({
		@NamedQuery(name = "Empresa.buscarPorId", query = "SELECT e FROM Empresa e WHERE e.idEmpresa = :idEmpresa", lockMode = LockModeType.NONE),
		@NamedQuery(name = "Empresa.buscarPorRazonSocial", query = "SELECT e FROM Empresa e WHERE e.razonSocial = :razonSocial", lockMode = LockModeType.NONE),
		@NamedQuery(name = "Empresa.buscarEmpresas", query = "SELECT e FROM Empresa e ORDER BY e.razonSocial", lockMode = LockModeType.NONE),
		@NamedQuery(name = "Empresa.eliminarEmpresaPorId", query = "DELETE FROM Empresa e WHERE e.idEmpresa = :idEmpresa", lockMode = LockModeType.NONE) })
public class Empresa implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "sec_empresa", sequenceName = "psicosoft_admin.sec_empresa", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sec_empresa")
	@Column(name = "\"idEmpresa\"", unique = true, nullable = false, insertable = false, updatable = false)
	private Integer idEmpresa;

	@Column(nullable = true)
	private Timestamp baja;

	@Column(length = 30)
	private String contacto;

	@Column(length = 10)
	private String cuenta;

	@Column(name = "\"detallesPago\"", length = 60)
	private String detallesPago;

	@Column(name = "\"formaPago\"", length = 20)
	private String formaPago;

	@Column(length = 2147483647)
	private String observaciones;

	@Column(name = "\"porcentajeDescuento\"")
	private double porcentajeDescuento;

	@Column(name = "\"razonSocial\"", nullable = false, length = 50, unique = true)
	private String razonSocial;

	@Column(nullable = false, length = 2147483647)
	private String tipo;

	@Column(nullable = false)
	private Timestamp creacion;

	// bi-directional many-to-one association to Sede
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "empresa", cascade = CascadeType.ALL, targetEntity = Sede.class)
	private List<Sede> sedes = new ArrayList<Sede>();

	// bi-directional one-to-many association to Usuario
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "empresa", cascade = CascadeType.ALL, targetEntity = Usuario.class)
	private List<Usuario> usuarios = new ArrayList<Usuario>();

	public Empresa() {
	}

	/**
	 * @param razonSocial
	 * @param contacto
	 * @param cuenta
	 * @param detallesPago
	 * @param formaPago
	 * @param observaciones
	 * @param porcentajeDescuento
	 * @param tipo
	 * @param creacion
	 */
	public Empresa(String razonSocial, String contacto, String cuenta,
			String detallesPago, String formaPago, String observaciones,
			double porcentajeDescuento, String tipo, Timestamp creacion) {
		super();
		this.razonSocial = razonSocial;
		this.contacto = contacto;
		this.cuenta = cuenta;
		this.detallesPago = detallesPago;
		this.formaPago = formaPago;
		this.observaciones = observaciones;
		this.porcentajeDescuento = porcentajeDescuento;
		this.tipo = tipo;
		this.creacion = creacion;
	}

	public Integer getIdEmpresa() {
		return this.idEmpresa;
	}

	public void setIdEmpresa(Integer idEmpresa) {
		this.idEmpresa = idEmpresa;
	}

	public Timestamp getBaja() {
		return this.baja;
	}

	public void setBaja(Timestamp baja) {
		this.baja = baja;
	}

	public String getContacto() {
		return this.contacto;
	}

	public void setContacto(String contacto) {
		this.contacto = contacto;
	}

	public String getCuenta() {
		return this.cuenta;
	}

	public void setCuenta(String cuenta) {
		this.cuenta = cuenta;
	}

	public String getDetallesPago() {
		return this.detallesPago;
	}

	public void setDetallesPago(String detallesPago) {
		this.detallesPago = detallesPago;
	}

	public String getFormaPago() {
		return this.formaPago;
	}

	public void setFormaPago(String formaPago) {
		this.formaPago = formaPago;
	}

	public String getObservaciones() {
		return this.observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	public double getPorcentajeDescuento() {
		return this.porcentajeDescuento;
	}

	public void setPorcentajeDescuento(double porcentajeDescuento) {
		this.porcentajeDescuento = porcentajeDescuento;
	}

	public String getRazonSocial() {
		return this.razonSocial;
	}

	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}

	public String getTipo() {
		return this.tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public Timestamp getCreacion() {
		return this.creacion;
	}

	public void setCreacion(Timestamp creacion) {
		this.creacion = creacion;
	}

	public List<Sede> getSedes() {
		return this.sedes;
	}

	public void setSedes(List<Sede> sedes) {
		this.sedes = sedes;
	}

	public Sede addSede(Sede sede) {
		getSedes().add(sede);
		sede.setEmpresa(this);

		return sede;
	}

	public Sede removeSede(Sede sede) {
		getSedes().remove(sede);
		sede.setEmpresa(null);

		return sede;
	}

	public List<Usuario> getUsuarios() {
		return this.usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public Usuario addUsuario(Usuario usuario) {
		getUsuarios().add(usuario);
		usuario.setEmpresa(this);

		return usuario;
	}

	public Usuario removeUsuario(Usuario usuario) {
		getUsuarios().remove(usuario);
		usuario.setEmpresa(null);

		return usuario;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((creacion == null) ? 0 : creacion.hashCode());
		result = prime * result
				+ ((idEmpresa == null) ? 0 : idEmpresa.hashCode());
		result = prime * result
				+ ((razonSocial == null) ? 0 : razonSocial.hashCode());
		result = prime * result + ((tipo == null) ? 0 : tipo.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Empresa other = (Empresa) obj;
		if (creacion == null) {
			if (other.creacion != null)
				return false;
		} else if (!creacion.equals(other.creacion))
			return false;
		if (idEmpresa == null) {
			if (other.idEmpresa != null)
				return false;
		} else if (!idEmpresa.equals(other.idEmpresa))
			return false;
		if (razonSocial == null) {
			if (other.razonSocial != null)
				return false;
		} else if (!razonSocial.equals(other.razonSocial))
			return false;
		if (tipo == null) {
			if (other.tipo != null)
				return false;
		} else if (!tipo.equals(other.tipo))
			return false;
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Empresa [idEmpresa=" + idEmpresa + ", razonSocial="
				+ razonSocial + ", contacto=" + contacto + ", cuenta=" + cuenta
				+ ", detallesPago=" + detallesPago + ", formaPago=" + formaPago
				+ ", observaciones=" + observaciones + ", porcentajeDescuento="
				+ porcentajeDescuento + ", tipo=" + tipo + ", creacion="
				+ creacion + ", baja=" + baja + "]";
	}

}